W tym raporcie analizujemy bazę danych materiałów wykorzystywanych w bateriach dostarczoną przez inicjatywę Materials Project. Celem analizy jest zrozumienie i ocena parametrów materiałów, które mają wpływ na wydajność i stabilność baterii.
options(repos = c(CRAN = "https://cloud.r-project.org"))
required_packages <- c("dplyr", "tidyr", "ggplot2", "plotly", "readr", "knitr", "corrplot")
new_packages <- required_packages[!(required_packages %in% installed.packages()[, "Package"])]
if(length(new_packages)) install.packages(new_packages)
library(dplyr)
library(tidyr)
library(ggplot2)
library(plotly)
library(readr)
library(knitr)
library(corrplot)
set.seed(123)
data <- read_csv("mp_batteries.csv")
## Rows: 4351 Columns: 17
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): Battery ID, Battery Formula, Working Ion, Formula Charge, Formula ...
## dbl (12): Max Delta Volume, Average Voltage, Gravimetric Capacity, Volumetri...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Zamiana spacji w nazwach kolumn na podkreślenia
colnames(data) <- gsub(" ", "_", colnames(data))
# Podgląd danych
head(data)
## # A tibble: 6 × 17
## Battery_ID Battery_Formula Working_Ion Formula_Charge Formula_Discharge
## <chr> <chr> <chr> <chr> <chr>
## 1 mp-30_Al Al0-2Cu Al Cu Al2Cu
## 2 mp-1022721_Al Al1-3Cu Al AlCu Al3Cu
## 3 mp-8637_Al Al0-5Mo Al Mo Al5Mo
## 4 mp-129_Al Al0-12Mo Al Mo Al12Mo
## 5 mp-91_Al Al0-12W Al W Al12W
## 6 mp-1055908_Al Al0-12Mn Al Mn MnAl12
## # ℹ 12 more variables: Max_Delta_Volume <dbl>, Average_Voltage <dbl>,
## # Gravimetric_Capacity <dbl>, Volumetric_Capacity <dbl>,
## # Gravimetric_Energy <dbl>, Volumetric_Energy <dbl>,
## # Atomic_Fraction_Charge <dbl>, Atomic_Fraction_Discharge <dbl>,
## # Stability_Charge <dbl>, Stability_Discharge <dbl>, Steps <dbl>,
## # Max_Voltage_Step <dbl>
missing_summary <- sapply(data, function(x) sum(is.na(x)))
missing_summary <- data.frame(Variable = names(missing_summary), MissingValues = missing_summary)
missing_summary %>% filter(MissingValues > 0)
## [1] Variable MissingValues
## <0 wierszy> (lub 'row.names' o zerowej długości)
missing_summary
## Variable MissingValues
## Battery_ID Battery_ID 0
## Battery_Formula Battery_Formula 0
## Working_Ion Working_Ion 0
## Formula_Charge Formula_Charge 0
## Formula_Discharge Formula_Discharge 0
## Max_Delta_Volume Max_Delta_Volume 0
## Average_Voltage Average_Voltage 0
## Gravimetric_Capacity Gravimetric_Capacity 0
## Volumetric_Capacity Volumetric_Capacity 0
## Gravimetric_Energy Gravimetric_Energy 0
## Volumetric_Energy Volumetric_Energy 0
## Atomic_Fraction_Charge Atomic_Fraction_Charge 0
## Atomic_Fraction_Discharge Atomic_Fraction_Discharge 0
## Stability_Charge Stability_Charge 0
## Stability_Discharge Stability_Discharge 0
## Steps Steps 0
## Max_Voltage_Step Max_Voltage_Step 0
brak brakujących danych
cat("Liczba obserwacji:", nrow(data), "\n")
## Liczba obserwacji: 4351
cat("Liczba zmiennych:", ncol(data), "\n")
## Liczba zmiennych: 17
# Podstawowe statystyki dla zmiennych liczbowych
summary_stats <- data %>%
select(where(is.numeric)) %>%
summary()
kable(summary_stats, caption = "Podstawowe statystyki dla zmiennych liczbowych")
| Max_Delta_Volume | Average_Voltage | Gravimetric_Capacity | Volumetric_Capacity | Gravimetric_Energy | Volumetric_Energy | Atomic_Fraction_Charge | Atomic_Fraction_Discharge | Stability_Charge | Stability_Discharge | Steps | Max_Voltage_Step | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 0.00002 | Min. :-7.755 | Min. : 5.176 | Min. : 24.08 | Min. :-583.5 | Min. :-2208.1 | Min. :0.00000 | Min. :0.007407 | Min. :0.00000 | Min. :0.00000 | Min. :1.000 | Min. : 0.0000 | |
| 1st Qu.: 0.01747 | 1st Qu.: 2.226 | 1st Qu.: 88.108 | 1st Qu.: 311.62 | 1st Qu.: 211.7 | 1st Qu.: 821.6 | 1st Qu.:0.00000 | 1st Qu.:0.086957 | 1st Qu.:0.03301 | 1st Qu.:0.01952 | 1st Qu.:1.000 | 1st Qu.: 0.0000 | |
| Median : 0.04203 | Median : 3.301 | Median : 130.691 | Median : 507.03 | Median : 401.8 | Median : 1463.8 | Median :0.00000 | Median :0.142857 | Median :0.07319 | Median :0.04878 | Median :1.000 | Median : 0.0000 | |
| Mean : 0.37531 | Mean : 3.083 | Mean : 158.291 | Mean : 610.62 | Mean : 444.1 | Mean : 1664.0 | Mean :0.03986 | Mean :0.159077 | Mean :0.14257 | Mean :0.12207 | Mean :1.167 | Mean : 0.1503 | |
| 3rd Qu.: 0.08595 | 3rd Qu.: 4.019 | 3rd Qu.: 187.600 | 3rd Qu.: 722.75 | 3rd Qu.: 614.4 | 3rd Qu.: 2252.3 | 3rd Qu.:0.04762 | 3rd Qu.:0.200000 | 3rd Qu.:0.13160 | 3rd Qu.:0.09299 | 3rd Qu.:1.000 | 3rd Qu.: 0.0000 | |
| Max. :293.19322 | Max. :54.569 | Max. :2557.627 | Max. :7619.19 | Max. :5926.9 | Max. :18305.9 | Max. :0.90909 | Max. :0.993333 | Max. :6.48710 | Max. :6.27781 | Max. :6.000 | Max. :26.9607 |
data %>%
select(Average_Voltage, Gravimetric_Capacity, Volumetric_Capacity) %>%
gather(key = "Variable", value = "Value") %>%
ggplot(aes(x = Value, fill = Variable)) +
geom_histogram(bins = 30, alpha = 0.7, position = "identity") +
facet_wrap(~ Variable, scales = "free") +
theme_minimal() +
labs(title = "Rozkłady wartości dla wybranych zmiennych", x = "Wartość", y = "Liczba wystąpień")
numeric_data <- data %>% select(where(is.numeric)) %>% na.omit()
correlation_matrix <- cor(numeric_data)
corrplot(correlation_matrix, method = "color", tl.cex = 1.2, addCoef.col = "black", number.cex = 0.8)
plot_ly(data = data, x = ~Gravimetric_Capacity, y = ~Average_Voltage,
type = 'scatter', mode = 'markers',
marker = list(size = 10, color = 'rgba(152, 0, 0, .8)', line = list(color = 'rgb(0, 0, 0)', width = 2))) %>%
layout(title = "Zależność pomiędzy pojemnością grawimetryczną a średnim napięciem",
xaxis = list(title = "Pojemność grawimetryczna (mAh/g)"),
yaxis = list(title = "Średnie napięcie (V)"))
model <- lm(Volumetric_Energy ~ Average_Voltage + Max_Delta_Volume + Gravimetric_Capacity, data = data)
summary(model)
##
## Call:
## lm(formula = Volumetric_Energy ~ Average_Voltage + Max_Delta_Volume +
## Gravimetric_Capacity, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7019.1 -506.2 -115.5 369.7 7395.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -129.2937 34.6952 -3.727 0.000197 ***
## Average_Voltage 425.6157 8.2219 51.766 < 2e-16 ***
## Max_Delta_Volume -34.4043 2.4005 -14.332 < 2e-16 ***
## Gravimetric_Capacity 3.1210 0.1005 31.062 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 977.2 on 4347 degrees of freedom
## Multiple R-squared: 0.4334, Adjusted R-squared: 0.433
## F-statistic: 1108 on 3 and 4347 DF, p-value: < 2.2e-16
# Wykres predykcji
data$Predicted_Volumetric_Energy <- predict(model, data)
ggplot(data, aes(x = Volumetric_Energy, y = Predicted_Volumetric_Energy)) +
geom_point(color = 'blue', alpha = 0.6) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
labs(title = "Predykcja gęstości energii w odniesieniu do objętości",
x = "Rzeczywista gęstość energii (Wh/L)",
y = "Prognozowana gęstość energii (Wh/L)") +
theme_minimal()
Na podstawie analizy danych dotyczących materiałów wykorzystywanych w bateriach, zidentyfikowano następujące kluczowe trendy:
Związek między pojemnością grawimetryczną a napięciem: Widzimy, że wyższa pojemność grawimetryczna (Gravimetric Capacity) powoduje dążenie średniego napięcia do zera.
Wpływ zmiany objętości na stabilność: Analiza zmienności objętości (Max Delta Volume) pokazuje, że materiały z mniejszymi zmianami objętości są bardziej stabilne w cyklach ładowania i rozładowania. Wartości te powinny być brane pod uwagę przy wyborze materiałów do produkcji baterii.
Rola udziału atomowego: Udział atomowy składników (Atomic Fraction Charge/Discharge) wydaje się mieć wpływ na gęstość energii (Gravimetric/Volumetric Energy). Materiały z korzystnymi proporcjami atomowymi wykazują lepsze właściwości energetyczne.
Wydajność materiałów: Ogólna analiza wskazuje, że materiały, które mają zarówno wysoką pojemność, jak i stabilność, są bardziej pożądane. Warto zatem skupić się na ich dalszym badaniu i optymalizacji.
Przewidywalność właściwości: Model regresji wskazuje na istotne zmienne wpływające na gęstość energii, co może pomóc w przewidywaniu właściwości nowych materiałów na podstawie ich parametrów.
Dalsze analizy mogą obejmować zastosowanie bardziej zaawansowanych modeli machine learning do przewidywania wydajności materiałów oraz eksplorację innych czynników, które mogą wpływać na stabilność i efektywność baterii.